home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d977.lha / UChess / UChessSrc.lha / dspcom.c < prev    next >
C/C++ Source or Header  |  1994-03-29  |  41KB  |  1,806 lines

  1. /*
  2.  * dspcom.c - C source for GNU CHESS
  3.  *
  4.  * Copyright (c) 1988,1989,1990 John Stanback
  5.  * Copyright (c) 1992 Free Software Foundation
  6.  *
  7.  * This file is part of GNU CHESS.
  8.  *
  9.  * GNU Chess is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * GNU Chess is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU Chess; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include "gnuchess.h"
  24. extern INTSIZE Mwpawn[64], Mbpawn[64], Mknight[2][64], Mbishop[2][64];
  25. extern char *version, *patchlevel;
  26. char __aligned mvstr[4][6];
  27. char __aligned *InPtr;
  28. #define BOOKMENUNUM 0xc2
  29.  
  30. #ifdef CACHE
  31. extern struct etable __far __aligned etab[2][ETABLE];
  32. #endif
  33.  
  34.  
  35. extern unsigned int TTadd;
  36.  
  37. int __aligned SecsPerMove=10;
  38. extern int IllegalMove;
  39. int __aligned func_num=0;
  40. int __aligned thinkahead=0;
  41. int __aligned ThinkInARow=0;
  42. int __aligned ThinkAheadWorked=0;
  43. int __aligned ThinkAheadDepth=0;
  44.  
  45. extern int backsrchaborted;
  46. extern short int ISZERO;
  47. extern short __aligned background;
  48. int __aligned verifyquiet=0;
  49. int __aligned MouseDropped=0;
  50.  
  51. #include <ctype.h>
  52. #include <signal.h>
  53.  
  54. #ifdef AMIGA
  55. #define __USE_SYSBASE
  56. #include <exec/types.h>
  57. #include <exec/exec.h>
  58. #include <proto/exec.h>
  59. #include <proto/dos.h>
  60. #include <proto/graphics.h>
  61. #include <proto/intuition.h>
  62. struct IntuiMessage __aligned globalmessage;
  63. int __aligned globalmessage_valid=0;
  64. extern struct Window __aligned *wG;
  65. extern int procpri;
  66. extern struct Process *myproc;
  67. extern struct MenuItem MenuItem6;
  68. extern struct Menu Menu1;
  69. extern unsigned char __far cookedchar[128];
  70. extern struct Menu __aligned Menu1;
  71. #define MenuList1 Menu1
  72. extern struct MenuItem __aligned MenuItem8ab;
  73. extern int __aligned MenuStripSet;
  74. #endif
  75.  
  76. #define SIGQUIT SIGINT
  77.  
  78. #ifdef MSDOS
  79. #include <dos.h>
  80. #include <conio.h>
  81. #include <stdlib.h>
  82. #include <string.h>
  83. #include <time.h>
  84. #else
  85. #include <dos.h>
  86. #include <stdlib.h>
  87. #include <string.h>
  88. #include <time.h>
  89. /*
  90. #include <sys/param.h>
  91. #include <sys/types.h>
  92. #include <sys/file.h>
  93. #include <sys/ioctl.h>
  94. */
  95. #endif
  96.  
  97.  
  98. /*
  99.  * ataks.h - Header source for GNU CHESS
  100.  *
  101.  * Copyright (c) 1988,1989,1990 John Stanback
  102.  * Copyright (c) 1992 Free Software Foundation
  103.  *
  104.  * This file is part of GNU CHESS.
  105.  *
  106.  * GNU Chess is free software; you can redistribute it and/or modify
  107.  * it under the terms of the GNU General Public License as published by
  108.  * the Free Software Foundation; either version 2, or (at your option)
  109.  * any later version.
  110.  *
  111.  * GNU Chess is distributed in the hope that it will be useful,
  112.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  113.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  114.  * GNU General Public License for more details.
  115.  *
  116.  * You should have received a copy of the GNU General Public License
  117.  * along with GNU Chess; see the file COPYING.  If not, write to
  118.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  119.  */
  120. inline int
  121. SqAtakd2 (ARGSZ int sq, ARGSZ int side)
  122.  
  123. /*
  124.  * See if any piece with color 'side' ataks sq.  First check pawns then
  125.  * Queen, Bishop, Rook and King and last Knight.
  126.  */
  127.  
  128. {
  129.   register INTSIZE u;
  130.   register unsigned char *ppos, *pdir;
  131.   INTSIZE xside;
  132.  
  133.   xside = side ^ 1;
  134.   pdir = nextdir[ptype[xside][pawn]][sq];
  135.   u = pdir[sq];            /* follow captures thread */
  136.   if (u != sq)
  137.     {
  138.       if (board[u] == pawn && color[u] == side)
  139.     return (true);
  140.       u = pdir[u];
  141.       if (u != sq && board[u] == pawn && color[u] == side)
  142.     return (true);
  143.     }
  144.   /* king capture */
  145.   if (distance (sq, PieceList[side][0]) == 1)
  146.     return (true);
  147.   /* try a queen bishop capture */
  148.   ppos = nextpos[bishop][sq];
  149.   pdir = nextdir[bishop][sq];
  150.   u = ppos[sq];
  151.   do
  152.     {
  153.       if (color[u] == neutral)
  154.     u = ppos[u];
  155.       else
  156.     {
  157.       if (color[u] == side && (board[u] == queen || board[u] == bishop))
  158.         return (true);
  159.       u = pdir[u];
  160.     }
  161.   } while (u != sq);
  162.   /* try a queen rook capture */
  163.   ppos = nextpos[rook][sq];
  164.   pdir = nextdir[rook][sq];
  165.   u = ppos[sq];
  166.   do
  167.     {
  168.       if (color[u] == neutral)
  169.     u = ppos[u];
  170.       else
  171.     {
  172.       if (color[u] == side && (board[u] == queen || board[u] == rook))
  173.         return (true);
  174.       u = pdir[u];
  175.     }
  176.   } while (u != sq);
  177.   /* try a knight capture */
  178.   pdir = nextdir[knight][sq];
  179.   u = pdir[sq];
  180.   do
  181.     {
  182.       if (color[u] == side && board[u] == knight)
  183.     return (true);
  184.       u = pdir[u];
  185.   } while (u != sq);
  186.   return (false);
  187. }
  188.  
  189.  
  190. void
  191. algbr (INTSIZE int f, INTSIZE int t, INTSIZE int flag)
  192.  
  193.  
  194. /*
  195.  * Generate move strings in different formats.
  196.  */
  197.  
  198. {
  199.   int m3p;
  200.  
  201.   if (f != t)
  202.     {
  203.       /* algebraic notation */
  204.       mvstr[0][0] = cxx[column (f)];
  205.       mvstr[0][1] = rxx[row (f)];
  206.       mvstr[0][2] = cxx[column (t)];
  207.       mvstr[0][3] = rxx[row (t)];
  208.       mvstr[0][4] = mvstr[3][0] = '\0';
  209.       if (((mvstr[1][0] = pxx[board[f]]) == 'P') || (flag & promote))
  210.     {
  211.       if (mvstr[0][0] == mvstr[0][2])    /* pawn did not eat */
  212.         {
  213.           mvstr[2][0] = mvstr[1][0] = mvstr[0][2];    /* to column */
  214.           mvstr[2][1] = mvstr[1][1] = mvstr[0][3];    /* to row */
  215.           m3p = 2;
  216.         }
  217.       else
  218.         /* pawn ate */
  219.         {
  220.           mvstr[2][0] = mvstr[1][0] = mvstr[0][0];    /* column */
  221.           mvstr[2][1] = mvstr[1][1] = mvstr[0][2];    /* to column */
  222.           mvstr[2][2] = mvstr[0][3];
  223.           m3p = 3;        /* to row */
  224.         }
  225.       if (flag & promote)
  226.         {
  227.           mvstr[0][4] = mvstr[1][2] = mvstr[2][m3p] = qxx[flag & pmask];
  228.           mvstr[0][5] = mvstr[1][3] = mvstr[2][m3p + 1] = mvstr[3][0] = '\0';
  229. #ifdef CHESSTOOL
  230.           mvstr[3][0] = mvstr[0][0];    /* Allow e7e8 for chesstool */
  231.           mvstr[3][1] = mvstr[0][1];
  232.           mvstr[3][2] = mvstr[0][2];
  233.           mvstr[3][3] = mvstr[0][3];
  234.           mvstr[3][4] = '\0';
  235. #endif
  236.         }
  237.       mvstr[2][m3p] = mvstr[1][2] = '\0';
  238.     }
  239.       else
  240.     /* not a pawn */
  241.     {
  242.       mvstr[2][0] = mvstr[1][0];
  243.       mvstr[2][1] = mvstr[0][1];
  244.       mvstr[2][2] = mvstr[1][1] = mvstr[0][2];    /* to column */
  245.       mvstr[2][3] = mvstr[1][2] = mvstr[0][3];    /* to row */
  246.       mvstr[2][4] = mvstr[1][3] = '\0';
  247.       strcpy (mvstr[3], mvstr[2]);
  248.       mvstr[3][1] = mvstr[0][0];
  249.       if (flag & cstlmask)
  250.         {
  251.           if (t > f)
  252.         {
  253.           strcpy (mvstr[1], CP[5]);
  254.           strcpy (mvstr[2], CP[7]);
  255.         }
  256.           else
  257.         {
  258.           strcpy (mvstr[1], CP[6]);
  259.           strcpy (mvstr[2], CP[8]);
  260.         }
  261.         }
  262.     }
  263.     }
  264.   else
  265.     mvstr[0][0] = mvstr[1][0] = mvstr[2][0] = mvstr[3][0] = '\0';
  266. }
  267.  
  268.  
  269. int
  270. VerifyMove (char *s, INTSIZE int iop, INTSIZE unsigned int *mv)
  271.  
  272. /*
  273.  * Compare the string 's' to the list of legal moves available for the
  274.  * opponent. If a match is found, make the move on the board.
  275.  */
  276.  
  277. {
  278.   static INTSIZE pnt, tempb, tempc, tempsf, tempst, cnt;
  279.   int r,c,l;
  280.   char mystr[80];
  281.   char piece;
  282.   static struct leaf xnode;
  283.   struct leaf *node;
  284.  
  285.   if ((s[1] >= 'a') && (s[1] <= 'h'))
  286.    {
  287.     if ((s[0] == 'n') || (s[0] == 'p') || (s[0] == 'b') ||
  288.         (s[0] == 'k') || (s[0] == 'r') || (s[0] == 'q'))
  289.      {
  290.       s[0] = toupper(s[0]);
  291.      }
  292.    }
  293.   *mv = 0;
  294.   if (iop == 2)
  295.     {
  296.       UnmakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
  297.       return (false);
  298.     }
  299.   cnt = 0;
  300.   MoveList (opponent, 2);
  301.   pnt = TrPnt[2];
  302.   while (pnt < TrPnt[3])
  303.     {
  304.       node = &Tree[pnt++];
  305.       algbr (node->f, node->t, (INTSIZE) node->flags);
  306.       if (strcmp (s, mvstr[0]) == 0 || strcmp (s, mvstr[1]) == 0 ||
  307.       strcmp (s, mvstr[2]) == 0 || strcmp (s, mvstr[3]) == 0)
  308.     {
  309.       cnt++;
  310.       xnode = *node;
  311.     }
  312.     }
  313.   if (cnt == 1)
  314.     {
  315.       MakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst, &INCscore);
  316.       if (SqAtakd2 (PieceList[opponent][0], computer))
  317.     {
  318.       UnmakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
  319. #if defined CHESSTOOL
  320.       printz (CP[15]);
  321. #else
  322. #ifdef NONDSP
  323. /* Illegal move in check */
  324. #ifndef AMIGA
  325.       printz (CP[77]);
  326.       printz ("\n");
  327. #else
  328.           DisplayComputerMove(CP[77]);
  329. #endif
  330. #else
  331. /* Illegal move in check */
  332.           if (!verifyquiet)
  333.         ShowMessage (CP[77]);
  334. #endif
  335. #endif /* CHESSTOOL */
  336.       return (false);
  337.     }
  338.       else
  339.     {
  340.       if (iop == 1)
  341.         return (true);
  342.       UpdateDisplay (xnode.f, xnode.t, 0, (INTSIZE) xnode.flags);
  343.       if ((board[xnode.t] == pawn)
  344.           || (xnode.flags & capture)
  345.           || (xnode.flags & cstlmask))
  346.         {
  347.           Game50 = GameCnt;
  348.           ZeroRPT ();
  349.         }
  350.       GameList[GameCnt].depth = GameList[GameCnt].score = 0;
  351.       GameList[GameCnt].nodes = 0;
  352.       ElapsedTime (1);
  353.       GameList[GameCnt].time = (INTSIZE) et;
  354.       if (TCflag)
  355.         {
  356.           TimeControl.clock[opponent] -= et;
  357.           timeopp[oppptr] = et;
  358.           --TimeControl.moves[opponent];
  359.         }
  360.       *mv = (xnode.f << 8) | xnode.t;
  361.       algbr (xnode.f, xnode.t, false);
  362. #ifdef AMIGA
  363.       strcpy(mystr,mvstr[0]);
  364.       r = mystr[3] - '1';
  365.       c = mystr[2] - 'a';
  366.       l = ((flag.reverse) ? locn (7 - r, 7 - c) : locn (r, c));
  367.       if (color[l] == neutral)
  368.        {
  369.     DisplayBeep(0L);
  370.         Delay(25L);
  371.     DisplayBeep(0L);
  372.         Delay(25L);
  373.     DisplayBeep(0L);
  374.         Delay(25L);
  375.         piece = ' ';
  376.        }
  377.       else if (color[l] == white)
  378.         piece = qxx[board[l]]; /* white are lower case pieces */
  379.       else
  380.         piece = pxx[board[l]]; /* black are upper case pieces */
  381.       AnimateAmigaMove(mystr,piece);
  382. #endif
  383.       return (true);
  384.     }
  385.     }
  386. #if defined CHESSTOOL
  387.   printz (CP[78]);
  388. #else
  389. #ifdef NONDSP
  390. /* Illegal move */
  391. #ifdef AMIGA
  392.   sprintf(mystr,CP[75],s);
  393.   if (!verifyquiet)
  394.    DisplayComputerMove(mystr);
  395. #else
  396.   printz (CP[75], s);
  397. #endif
  398. #ifdef DEBUG8
  399.   if (1)
  400.     {
  401.       FILE *D;
  402.       int r, c, l;
  403.       extern unsigned INTSIZE int PrVar[];
  404.       D = fopen ("/tmp/DEBUG", "a+");
  405.       pnt = TrPnt[2];
  406.       fprintf (D, "resp = %d\n", ResponseTime);
  407.       fprintf (D, "iop = %d\n", iop);
  408.       fprintf (D, "matches = %d\n", cnt);
  409.       algbr (hint >> 8, hint & 0xff, (INTSIZE) 0);
  410.       fprintf (D, "hint %s\n", mvstr[0]);
  411.       fprintf (D, "inout move is %s\n", s);
  412.       for (r = 1; PrVar[r]; r++)
  413.     {
  414.       algbr (PrVar[r] >> 8, PrVar[r] & 0xff, (INTSIZE) 0);
  415.       fprintf (D, " %s", mvstr[0]);
  416.     }
  417.       fprintf (D, "\n");
  418.       fprintf (D, "legal move are \n");
  419.       while (pnt < TrPnt[3])
  420.     {
  421.       node = &Tree[pnt++];
  422.       algbr (node->f, node->t, (INTSIZE) node->flags);
  423.       fprintf (D, "%s %s %s %s\n", mvstr[0], mvstr[1], mvstr[2], mvstr[3]);
  424.     }
  425.       fprintf (D, "\n current board is\n");
  426.       for (r = 7; r >= 0; r--)
  427.     {
  428.       for (c = 0; c <= 7; c++)
  429.         {
  430.           l = locn (r, c);
  431.           if (color[l] == neutral)
  432.         fprintf (D, " -");
  433.           else if (color[l] == white)
  434.         fprintf (D, " %c", qxx[board[l]]);
  435.           else
  436.         fprintf (D, " %c", pxx[board[l]]);
  437.         }
  438.       fprintf (D, "\n");
  439.     }
  440.       fprintf (D, "\n");
  441.       fclose (D);
  442.       abort ();
  443.     }
  444. #endif
  445. #else
  446. /* Illegal move */
  447.  if (!verifyquiet)
  448.   ShowMessage (CP[76]);
  449. #endif
  450. #endif /* CHESSTOOL */
  451. #if !defined CHESSTOOL && !defined XBOARD
  452.   if (cnt > 1)
  453.     ShowMessage (CP[32]);
  454. #endif /* CHESSTOOL */
  455.   return (false);
  456. }
  457.  
  458. int
  459. parser (char *f, int side)
  460. {
  461.   int c1, r1, c2, r2;
  462.  
  463.   if (f[4] == 'o')
  464.     if (side == black)
  465.       return 0x3C3A;
  466.     else
  467.       return 0x0402;
  468.   else if (f[0] == 'o')
  469.     if (side == black)
  470.       return 0x3C3E;
  471.     else
  472.       return 0x0406;
  473.   else
  474.     {
  475.       c1 = f[0] - 'a';
  476.       r1 = f[1] - '1';
  477.       c2 = f[2] - 'a';
  478.       r2 = f[3] - '1';
  479.       return (locn (r1, c1) << 8) | locn (r2, c2);
  480.     }
  481.   /*NOTREACHED*/
  482. }
  483.  
  484. int myfgets(char *buff,int len,BPTR fd)
  485. {
  486.  char tmpch;
  487.  int done=0;
  488.  int numchars=0;
  489.  int retval;
  490.  
  491.  retval = 1;
  492.  do{
  493.     if (Read(fd,&tmpch,1L) != 1L)
  494.      {
  495.       done = 1;
  496.       retval = 0;
  497.      }
  498.     else
  499.      {
  500.       buff[numchars++] = tmpch;
  501.       if (tmpch == '\n')
  502.        {
  503.         done = 1;
  504.        }
  505.       if (numchars >= (len-1))
  506.        {
  507.         done = 1;
  508.         retval = 0;
  509.        }
  510.      }
  511.   } while (!done);
  512.  buff[numchars] = '\0';
  513.  return(retval);
  514. }
  515.  
  516. void
  517. GetGame (void)
  518. {
  519.   char checkstr[8];
  520.   BPTR fd;
  521.   char fname[256], *p;
  522.   int c, i, j;
  523.   INTSIZE sq;
  524.  
  525. /* enter file name */
  526.  if (!GetFileName(fname))
  527.   {
  528.    return;
  529.   }
  530.  (void)SetTaskPri((struct Task *)myproc,0);
  531.  if (fname[0] == 0)
  532.   ShowMessage (CP[63]);
  533. #ifndef AMIGA
  534.   scanz ("%s", fname);
  535. #endif
  536. /* chess.000 */
  537.   if (fname[0] == '\0')
  538.     strcpy (fname, CP[137]);
  539.   ShowMessage("Loading Game..");
  540.   Delay(20L);
  541.   if ((fd = Open (fname, MODE_OLDFILE)) != NULL)
  542.     {
  543.       Delay(20L);
  544.       NewGame ();
  545.       ShowMessage("Loading Game..");
  546.       Delay(10L);
  547.       myfgets (fname, 256, fd);
  548.       for(i=0;i<5;i++)
  549.        checkstr[i] = fname[i];
  550.       checkstr[5] = 0;
  551.       if (stricmp(checkstr,"Black"))
  552.        {
  553.         DisplayBeep(0L);
  554.         Delay(25L);
  555.         DisplayBeep(0L);
  556.         Close(fd);
  557.         return;
  558.        }
  559.       computer = opponent = white;
  560.       InPtr = fname;
  561.       skip ();
  562.       if (*InPtr == 'c')
  563.     computer = black;
  564.       else
  565.     opponent = black;
  566.       skip ();
  567.       skip ();
  568.       skip ();
  569.       Game50 = atoi (InPtr);
  570.       myfgets (fname, 256, fd);
  571.       InPtr = &fname[14];
  572.       castld[white] = ((*InPtr == CP[214][0]) ? true : false);
  573.       skip ();
  574.       skip ();
  575.       castld[black] = ((*InPtr == CP[214][0]) ? true : false);
  576.       myfgets (fname, 256, fd);
  577.       InPtr = &fname[11];
  578.       skipb ();
  579.       TCflag = atoi (InPtr);
  580.       skip ();
  581.       InPtr += 14;
  582.       skipb ();
  583.       OperatorTime = atoi (InPtr);
  584.       myfgets (fname, 256, fd);
  585.       InPtr = &fname[11];
  586.       skipb ();
  587.       TimeControl.clock[white] = atoi (InPtr);
  588.       skip ();
  589.       skip ();
  590.       TimeControl.moves[white] = atoi (InPtr);
  591.       myfgets (fname, 256, fd);
  592.       InPtr = &fname[11];
  593.       skipb ();
  594.       TimeControl.clock[black] = atoi (InPtr);
  595.       skip ();
  596.       skip ();
  597.       TimeControl.moves[black] = atoi (InPtr);
  598.       myfgets (fname, 256, fd);
  599.       for (i = 7; i > -1; i--)
  600.     {
  601.       myfgets (fname, 256, fd);
  602.       p = &fname[2];
  603.       InPtr = &fname[11];
  604.       skipb ();
  605.       for (j = 0; j < 8; j++)
  606.         {
  607.           sq = i * 8 + j;
  608.           if (*p == '.')
  609.         {
  610.           board[sq] = no_piece;
  611.           color[sq] = neutral;
  612.         }
  613.           else
  614.         {
  615.           for (c = 0; c < 8; c++)
  616.             {
  617.               if (*p == pxx[c])
  618.             {
  619.               board[sq] = c;
  620.               color[sq] = black;
  621.             }
  622.             }
  623.           for (c = 0; c < 8; c++)
  624.             {
  625.               if (*p == qxx[c])
  626.             {
  627.               board[sq] = c;
  628.               color[sq] = white;
  629.             }
  630.             }
  631.         }
  632.           p++;
  633.           Mvboard[sq] = atoi (InPtr);
  634.           skip ();
  635.         }
  636.     }
  637.       GameCnt = 0;
  638.       flag.regularstart = false/*true*/;
  639.       myfgets (fname, 256, fd);
  640.       myfgets (fname, 256, fd);
  641.       myfgets (fname, 256, fd);
  642.       while (myfgets (fname, 256, fd))
  643.     {
  644.       struct GameRec *g;
  645.       int side = black; // was side = computer in 2.51
  646.  
  647. /*printf("in while loop\n");*/
  648.       side = side ^ 1;
  649.       ++GameCnt;
  650.       InPtr = fname;
  651.       skipb ();
  652.       g = &GameList[GameCnt];
  653.       g->gmove = parser (InPtr, side);
  654.       skip ();
  655.       g->score = atoi (InPtr);
  656.       skip ();
  657.       g->depth = atoi (InPtr);
  658.       skip ();
  659.       g->nodes = atoi (InPtr);
  660.       skip ();
  661.       g->time = atoi (InPtr);
  662.       skip ();
  663.       g->flags = c = atoi (InPtr);
  664.       skip ();
  665.       g->hashkey = strtol (InPtr, (char **) NULL, 16);
  666.       skip ();
  667.       g->hashbd = strtol (InPtr, (char **) NULL, 16);
  668.       g->piece = no_piece;
  669.       g->color = neutral;
  670.       if (c & (capture | cstlmask))
  671.         {
  672.           if (c & capture)
  673.         {
  674.           skip ();
  675.           for (c = 0; c < 8; c++)
  676.             if (pxx[c] == *InPtr)
  677.               break;
  678.           g->piece = c;
  679.         }
  680.           skip ();
  681.           g->color = ((*InPtr == CP[119][0]) ? black : white);
  682.         }
  683.     }
  684.       /* GameCnt--; */
  685.       if (TimeControl.clock[white] > 0)
  686.     TCflag = true;
  687.       Close (fd);
  688.     }
  689.   ISZERO = 1;
  690.   ZeroRPT ();
  691.   InitializeStats ();
  692.   UpdateDisplay (0, 0, 1, 0);
  693.   Sdepth = 0;
  694.   hint = 0;
  695.   DisableMoveNow();
  696.   if (!TCflag)
  697.    {
  698.     EnableMoveNow();
  699.    }
  700.   else
  701.    {
  702.     i = player;
  703.     player = black;
  704.     UpdateClocks();
  705.     player = white;
  706.     UpdateClocks();
  707.     player = i;
  708.     if ((((TimeControl.clock[black])/TimeControl.moves[black]) > 5900) ||
  709.         (((TimeControl.clock[white])/TimeControl.moves[white]) > 5900))
  710.      {
  711.       EnableMoveNow();
  712.      }
  713.    }
  714.   flag.regularstart = false;
  715.   Book = 0;
  716.   if (MenuStripSet)
  717.    {
  718.     
  719.     MenuItem8ab.Flags &= (0xffff ^ CHECKED);
  720.     SetMenuStrip(wG,&MenuList1);    /* attach any Menu */
  721.    }
  722.   ZeroTTable();
  723. #ifndef AMIGA
  724.    memset ((signed char *) etab, 0, sizeof (etab));
  725. #else
  726.    ClearMem(etab,sizeof(etab));
  727. #endif
  728.   ShowMessage("Game Loaded");
  729. #ifdef AMIGA
  730.   DrawAmigaBoard();
  731. #endif
  732.   (void)SetTaskPri((struct Task *)myproc,procpri);
  733. }
  734.  
  735. void
  736. GetXGame (void)
  737. {
  738.   BPTR fd;
  739.   char fname[256], *p;
  740.   int c, i, j;
  741.   INTSIZE sq;
  742. /* Enter file name */
  743.   ShowMessage (CP[63]);
  744. #ifndef AMIGA
  745.   scanz ("%s", fname);
  746. #endif
  747.   if (fname[0] == '\0')
  748. /* xboard.position.read*/
  749.     strcpy (fname, CP[205]);
  750.   if ((fd = Open (fname, MODE_OLDFILE)) != NULL)
  751.     {
  752.       NewGame ();
  753.       flag.regularstart = false;
  754.       Book = false;
  755.       myfgets (fname, 256, fd);
  756.       fname[6] = '\0';
  757.       if (strcmp (fname, CP[206]))
  758.     return;
  759.       myfgets (fname, 256, fd);
  760.       myfgets (fname, 256, fd);
  761.       for (i = 7; i > -1; i--)
  762.     {
  763.       myfgets (fname, 256, fd);
  764.       p = fname;
  765.       for (j = 0; j < 8; j++)
  766.         {
  767.           sq = i * 8 + j;
  768.           if (*p == '.')
  769.         {
  770.           board[sq] = no_piece;
  771.           color[sq] = neutral;
  772.         }
  773.           else
  774.         {
  775.           for (c = 0; c < 8; c++)
  776.             {
  777.               if (*p == qxx[c])
  778.             {
  779.               board[sq] = c;
  780.               color[sq] = black;
  781.             }
  782.             }
  783.           for (c = 0; c < 8; c++)
  784.             {
  785.               if (*p == pxx[c])
  786.             {
  787.               board[sq] = c;
  788.               color[sq] = white;
  789.             }
  790.             }
  791.         }
  792.           p += 2;
  793.         }
  794.     }
  795.       Close (fd);
  796.     }
  797.   ISZERO = 1;
  798.   ZeroRPT ();
  799.   InitializeStats ();
  800.   UpdateDisplay (0, 0, 1, 0);
  801.   Sdepth = 0;
  802.   hint = 0;
  803. }
  804.  
  805. void
  806. SaveGame (void)
  807. {
  808.   FILE *fd;
  809.   char fname[256];
  810.   INTSIZE sq, i, c, f, t;
  811.   char p;
  812.  
  813.   if (!(GetFileName(savefile)))   
  814.    { 
  815.     return;
  816.    }
  817.   (void)SetTaskPri((struct Task *)myproc,0);
  818.   if (savefile[0])
  819.     strcpy (fname, savefile);
  820.   else
  821.     {
  822. /* Enter file name*/
  823.       ShowMessage (CP[63]);
  824. #ifndef AMIGA
  825.       scanz ("%s", fname);
  826. #endif
  827.     }
  828.  
  829.   if (fname[0] == '\0')
  830. /* chess.000 */
  831.     strcpy (fname, CP[137]);
  832.   Delay(25L);
  833.   if ((fd = fopen (fname, "w")) != NULL)
  834.     {
  835.       char *b, *w;
  836.  
  837.       Delay(25L);
  838.       b = w = CP[74];
  839.       if (computer == black)
  840.     b = CP[141];
  841.       if (computer == white)
  842.     w = CP[141];
  843.       fprintf (fd, CP[37], b, w, Game50);
  844.       fprintf (fd, CP[42], castld[white] ? CP[214] : CP[215], castld[black] ? CP[214] : CP[215]);
  845.       fprintf (fd, CP[111], TCflag, OperatorTime);
  846.       fprintf (fd, CP[117],
  847.            TimeControl.clock[white], TimeControl.moves[white],
  848.            TimeControl.clock[black], TimeControl.moves[black]);
  849.       for (i = 7; i > -1; i--)
  850.     {
  851.       fprintf (fd, "%1d ", i + 1);
  852.       for (c = 0; c < 8; c++)
  853.         {
  854.           sq = i * 8 + c;
  855.           switch (color[sq])
  856.         {
  857.         case black:
  858.           p = pxx[board[sq]];
  859.           break;
  860.         case white:
  861.           p = qxx[board[sq]];
  862.           break;
  863.         default:
  864.           p = '.';
  865.         }
  866.           fprintf (fd, "%c", p);
  867.         }
  868.       for (f = i * 8; f < i * 8 + 8; f++)
  869.         fprintf (fd, " %d", Mvboard[f]);
  870.       fprintf (fd, "\n");
  871.     }
  872.       fprintf (fd, "  %s\n", cxx);
  873.       fprintf (fd, CP[126]);
  874.       for (i = 1; i <= GameCnt; i++)
  875.     {
  876.       struct GameRec *g = &GameList[i];
  877.  
  878.       f = g->gmove >> 8;
  879.       t = (g->gmove & 0xFF);
  880.       algbr (f, t, g->flags);
  881.       fprintf (fd, "%s %5d %5d %7ld %5d %5d  %#08lx %#08lx  %c   %s\n",
  882.            mvstr[0], g->score, g->depth,
  883.            g->nodes, g->time, g->flags, g->hashkey, g->hashbd,
  884.        pxx[g->piece], ((g->color == 2) ? "     " : ColorStr[g->color]));
  885.     }
  886.       fclose (fd);
  887. /* Game saved */
  888.       ShowMessage (CP[70]);
  889.     }
  890.   else
  891.     /*ShowMessage ("Could not open file");*/
  892.     ShowMessage (CP[48]);
  893.   (void)SetTaskPri((struct Task *)myproc,procpri);
  894. }
  895.  
  896. void
  897. ListGame (getstr)
  898. int getstr;
  899. {
  900.   FILE *fd;
  901.   INTSIZE i, f, t;
  902.   long when;
  903.   char fname[256], dbuf[256];
  904.  
  905.   if (listfile[0])
  906.     strcpy (fname, listfile);
  907.   else
  908.     {
  909. #ifdef MSDOS
  910.       sprintf (fname, "chess.lst");
  911. #else
  912.       if (!getstr)
  913.        {
  914.         time (&when);
  915.         strncpy (dbuf, ctime (&when), 20);
  916.         dbuf[7] = '\0';
  917.         dbuf[10] = '\0';
  918.         dbuf[13] = '\0';
  919.         dbuf[16] = '\0';
  920.         dbuf[19] = '\0';
  921. /* use format "CLp16.Jan01-020304B" when patchlevel is 16,
  922.    date is Jan 1
  923.    time is 02:03:04
  924.    program played black */
  925.         sprintf (fname, "t:UC%s.%s%s-%s%s%s%c", patchlevel, dbuf + 4, dbuf + 8, dbuf + 11, dbuf + 14, dbuf + 17, ColorStr[computer][0]);
  926.         /* replace space padding with 0 */
  927.         for (i = 0; fname[i] != '\0'; i++)
  928.         if (fname[i] == ' ')
  929.         fname[i] = '0';
  930.        }
  931.       else
  932.        {
  933.         if (!GetFileName(fname))
  934.          {
  935.           return;
  936.          }
  937.        }
  938. #endif /* MSDOS */
  939.     }
  940.   Delay(5L);
  941.   (void)SetTaskPri((struct Task *)myproc,0);
  942.   fd = fopen (fname, "w");
  943.   Delay(5L);
  944.   if (!fd)
  945.     {
  946.      (void)SetTaskPri((struct Task *)myproc,procpri);
  947.      return;
  948.     }
  949.   /*fprintf (fd, "gnuchess game %d\n", u);*/
  950.   fprintf (fd, "%s\n", VERSTRING);
  951.   fprintf (fd, CP[10]);
  952.   fprintf (fd, CP[11]);
  953.   for (i = 1; i <= GameCnt; i++)
  954.     {
  955.       f = GameList[i].gmove >> 8;
  956.       t = (GameList[i].gmove & 0xFF);
  957.       algbr (f, t, GameList[i].flags);
  958.       if(GameList[i].flags & book)
  959.           fprintf (fd, "%5s  %5d    Book%7ld %5d", mvstr[0],
  960.            GameList[i].score, 
  961.            GameList[i].nodes, GameList[i].time);
  962.       else
  963.           fprintf (fd, "%5s  %5d     %2d %7ld %5d", mvstr[0],
  964.            GameList[i].score, GameList[i].depth,
  965.            GameList[i].nodes, GameList[i].time);
  966.       if ((i % 2) == 0)
  967.     {
  968.       fprintf (fd, "\n");
  969. #ifdef DEBUG40
  970.       if (computer == black)
  971.         fprintf (fd, " %d %d %d %d %d %d %d\n",
  972.              GameList[i].d1,
  973.              GameList[i].d2,
  974.              GameList[i].d3,
  975.              GameList[i].d4,
  976.              GameList[i].d5,
  977.              GameList[i].d6,
  978.              GameList[i].d7);
  979.       else
  980.         fprintf (fd, " %d %d %d %d %d %d %d\n",
  981.              GameList[i - 1].d1,
  982.              GameList[i - 1].d2,
  983.              GameList[i - 1].d3,
  984.              GameList[i - 1].d4,
  985.              GameList[i - 1].d5,
  986.              GameList[i - 1].d6,
  987.              GameList[i - 1].d7);
  988. #endif
  989.     }
  990.       else
  991.     fprintf (fd, "         ");
  992.     }
  993.   fprintf (fd, "\n\n");
  994.   if (GameList[GameCnt].flags & draw)
  995.     {
  996.       fprintf (fd, CP[54], DRAW);
  997.     }
  998.   else if (GameList[GameCnt].score == -9999)
  999.     {
  1000.       fprintf (fd, "%s\n", ColorStr[player ]);
  1001.     }
  1002.   else if (GameList[GameCnt].score == 9998)
  1003.     {
  1004.       fprintf (fd, "%s\n", ColorStr[player ^ 1]);
  1005.     }
  1006.   fclose (fd);
  1007.   (void)SetTaskPri((struct Task *)myproc,procpri);
  1008. }
  1009.  
  1010. void
  1011. Undo (void)
  1012.  
  1013. /*
  1014.  * Undo the most recent half-move.
  1015.  */
  1016.  
  1017. {
  1018.   INTSIZE f, t;
  1019.   f = GameList[GameCnt].gmove >> 8;
  1020.   t = GameList[GameCnt].gmove & 0xFF;
  1021.   if (board[t] == king && distance (t, f) > 1)
  1022.     (void) castle (GameList[GameCnt].color, f, t, 2);
  1023.   else
  1024.     {
  1025.       /* Check for promotion: */
  1026.       if (GameList[GameCnt].flags & promote)
  1027.     {
  1028.       board[t] = pawn;
  1029.     }
  1030.       board[f] = board[t];
  1031.       color[f] = color[t];
  1032.       board[t] = GameList[GameCnt].piece;
  1033.       color[t] = GameList[GameCnt].color;
  1034.       if (color[t] != neutral)
  1035.     Mvboard[t]--;
  1036.       Mvboard[f]--;
  1037.     }
  1038.   if (GameList[GameCnt].flags & epmask)
  1039.     EnPassant (otherside[color[f]], f, t, 2);
  1040.   else
  1041.     InitializeStats ();
  1042.   epsquare = GameList[GameCnt].epssq;
  1043.   if (TCflag && (TCmoves>1))
  1044.     ++TimeControl.moves[color[f]];
  1045.   hashkey = GameList[GameCnt].hashkey;
  1046.   hashbd = GameList[GameCnt].hashbd;
  1047.   GameCnt--;
  1048.   computer = computer ^ 1;
  1049.   opponent = opponent ^ 1;
  1050.   Mate = flag.mate = false;
  1051.   Sdepth = 0;
  1052.   player = player ^ 1;
  1053.   ShowSidetoMove ();
  1054.   UpdateDisplay (0, 0, 1, 0);
  1055.  
  1056.   InitializeStats();
  1057.   ZeroRPT();
  1058.   ZeroTTable();
  1059. #ifndef AMIGA
  1060.    memset ((signed char *) etab, 0, sizeof (etab));
  1061. #else
  1062.    ClearMem(etab,sizeof(etab));
  1063. #endif
  1064. #ifdef HISTORY
  1065. #ifdef AMIGA
  1066.  ClearMem(history,sizeof(history));
  1067. #else
  1068.  memset(history,0,sizeof(history));
  1069. #endif
  1070. #endif
  1071.  
  1072. /*  if (flag.regularstart)
  1073.     Book = BOOKFAIL;*/
  1074. }
  1075.  
  1076. void
  1077.  TestSpeed (void (*f) ( INTSIZE int side, INTSIZE int ply), unsigned j)
  1078. {
  1079.   char astr[256];
  1080.   INTSIZE i;
  1081.   long cnt, rate, t1, t2;
  1082.  
  1083.   t1 = time (0);
  1084.   Forbid();
  1085.   for (i = 0; i < j; i++)
  1086.     {
  1087.       f (opponent, 2);
  1088.     }
  1089.   Permit();
  1090.   t2 = time (0);
  1091.   cnt = j * (TrPnt[3] - TrPnt[2]);
  1092.   if (t2 - t1)
  1093.     et = (t2 - t1) * 100;
  1094.   else
  1095.     et = 1;
  1096.   rate = (et) ? (cnt / et) : 0;
  1097.   /*printz ("Nodes= %ld Nodes/sec= %ld\n", cnt, rate);*/
  1098. #ifdef NONDSP
  1099. #ifdef AMIGA
  1100. if (!func_num)
  1101.  sprintf(astr,"Mlst=%dN/s",rate*100);
  1102. else if (func_num == 1)
  1103.  sprintf(astr,"Clst=%dN/s",rate*100);
  1104. ShowMessage(astr);
  1105. #else
  1106.   printz (CP[91], cnt, rate*100);
  1107. #endif
  1108. #ifdef DEBUG9
  1109.   for (j = TrPnt[2]; j < TrPnt[3]; j++)
  1110.     {
  1111.       struct leaf *node = &Tree[j];
  1112.       algbr (node->f, node->t, node->flags);
  1113.       printf ("%s %s %s %s %d %x\n", mvstr[0], mvstr[1], mvstr[2], mvstr[3],node->score,node->flags);
  1114.     }
  1115. #endif
  1116. #else
  1117.   ShowNodeCnt (cnt);
  1118. #endif
  1119. }
  1120.  
  1121. void
  1122.  TestPSpeed (INTSIZE int (*f) (INTSIZE int side), unsigned j)
  1123. {
  1124.   char astr[256];
  1125.   INTSIZE i;
  1126.   long cnt, rate, t1, t2;
  1127.  
  1128.   t1 = time (0);
  1129.   Forbid();
  1130.   for (i = 0; i < j; i++)
  1131.     {
  1132.       (void) f (opponent);
  1133.     }
  1134.   Permit();
  1135.   t2 = time (0);
  1136.   cnt = j;
  1137.   if (t2 - t1)
  1138.     et = (t2 - t1) * 100;
  1139.   else
  1140.     et = 1;
  1141.   rate = (et) ? (cnt / et) : 0;
  1142.   /*printz ("Nodes= %ld Nodes/sec= %ld\n", cnt, rate);*/
  1143. #ifdef NONDSP
  1144. #ifdef AMIGA
  1145. sprintf(astr,"Eval=%ldN/s",rate*100);
  1146. ShowMessage(astr);
  1147. #else
  1148.   printz (CP[91], cnt, rate*100);
  1149. #endif
  1150. #else
  1151.   ShowNodeCnt (cnt);
  1152. #endif
  1153. }
  1154.  
  1155.  
  1156. void
  1157. SetMachineTime (char *s)
  1158. {
  1159.   char *time;
  1160.   int m, t;
  1161.   time = &s[strlen (CP[197])];
  1162.   m = strtol (time, &time, 10);
  1163.   t = strtol (time, &time, 10);
  1164.   if (t)
  1165.     TimeControl.clock[computer] = t;
  1166.   if (m)
  1167.     TimeControl.moves[computer] = m;
  1168. #ifdef XBOARD
  1169.   printz (CP[222], m, t);
  1170. #endif
  1171. }
  1172.  
  1173.  
  1174. void
  1175. InputCommand (cstring)
  1176.  
  1177. char *cstring;
  1178.  
  1179. /*
  1180.  * Process the users command. If easy mode is OFF (the computer is thinking
  1181.  * on opponents time) and the program is out of book, then make the 'hint'
  1182.  * move on the board and call SelectMove() to find a response. The user
  1183.  * terminates the search by entering ^C (quit siqnal) before entering a
  1184.  * command. If the opponent does not make the hint move, then set Sdepth to
  1185.  * zero.
  1186.  */
  1187.  
  1188. {
  1189.   int need_to_zero;
  1190.   char tstr[40];
  1191.   int i = 0;
  1192.   INTSIZE have_shown_prompt = false;
  1193.   INTSIZE ok, tmp;
  1194.   unsigned INTSIZE mv;
  1195.   char s[80], sx[80];
  1196.  
  1197. #if defined CHESSTOOL
  1198.   INTSIZE normal = false;
  1199.  
  1200. #endif
  1201.  
  1202.   ok = flag.quit = false;
  1203.   player = opponent;
  1204.   ft = 0;
  1205. #ifdef CACHE
  1206.   if(TTadd > ttblsize) // want to zero out ttable each time
  1207.    ZeroTTable();
  1208. #endif
  1209.   if (hint > 0 && !flag.easy && !flag.force)
  1210.     if ((board[hint >> 8] != pawn) || ((row (hint & 0x3f) != 0) && (row (hint & 0x3f) != 7)))
  1211.       {
  1212.         thinkahead = 1;
  1213. /*    fflush (stdout);*/
  1214.         ft = time0;
  1215.     /*time0 = time ((long *) 0);*/
  1216.     algbr ((INTSIZE) hint >> 8, (INTSIZE) hint & 0x3F, false);
  1217.     strcpy (s, mvstr[0]);
  1218.     tmp = epsquare;
  1219. #ifdef DEBUG12
  1220.     if (1)
  1221.       {
  1222.         FILE *D;
  1223.         int r, c, l;
  1224.         extern unsigned INTSIZE int PrVar[];
  1225.         D = fopen ("/tmp/DEBUGA", "a+");
  1226.         fprintf (D, "score = %d\n", root->score);
  1227.         fprintf (D, "inout move is %s\n", s);
  1228.         for (r = 1; PrVar[r]; r++)
  1229.           {
  1230.         algbr (PrVar[r] >> 8, PrVar[r] & 0xff, (INTSIZE) 0);
  1231.         fprintf (D, " %s", mvstr[0]);
  1232.           }
  1233.         fprintf (D, "\n current board is\n");
  1234.         for (r = 7; r >= 0; r--)
  1235.           {
  1236.         for (c = 0; c <= 7; c++)
  1237.           {
  1238.             l = locn (r, c);
  1239.             if (color[l] == neutral)
  1240.               fprintf (D, " -");
  1241.             else if (color[l] == white)
  1242.               fprintf (D, " %c", qxx[board[l]]);
  1243.             else
  1244.               fprintf (D, " %c", pxx[board[l]]);
  1245.           }
  1246.         fprintf (D, "\n");
  1247.           }
  1248.         fprintf (D, "\n");
  1249.         fclose (D);
  1250.       }
  1251. #endif
  1252. #if !defined CHESSTOOL
  1253. #ifndef AMIGA
  1254.     if (flag.post)
  1255.       GiveHint ();
  1256. #endif
  1257. #endif
  1258.         verifyquiet = 1;
  1259.     if (VerifyMove (s, 1, &mv))
  1260.       {
  1261.         Sdepth = 0;
  1262. #ifdef QUIETBACKGROUND
  1263. #ifdef NONDSP
  1264.         PromptForMove ();
  1265. #else
  1266.         ShowSidetoMove ();
  1267.         ShowPrompt ();
  1268. #endif
  1269.         have_shown_prompt = true;
  1270. #endif /* QUIETBACKGROUND */
  1271.             backsrchaborted = 0;
  1272.         SelectMove (computer, 2);
  1273. #ifdef OLD_LOOKAHEAD
  1274.         VerifyMove (s, 2, &mv);
  1275.         Sdepth = 0;
  1276. #else // faster lookahead on predict
  1277.         VerifyMove (s, 2, &mv);
  1278. //sprintf(tstr,"sd = %d",Sdepth);
  1279. //ShowMessage(tstr);
  1280.         if ((Sdepth > 0)&&(backsrchaborted))
  1281.               Sdepth--;
  1282. #endif
  1283.       }
  1284.          verifyquiet = 0;
  1285.     /*ft = (time ((long *) 0) - time0) * 100;*/
  1286.     epsquare = tmp;
  1287.     time0 = ft;
  1288.       }
  1289.   while (!(ok || flag.quit))
  1290.     {
  1291.       need_to_zero = 0;
  1292. #if defined CHESSTOOL
  1293.       normal = false;
  1294. #endif
  1295.       player = opponent;
  1296. #ifdef QUIETBACKGROUND
  1297.       if (!have_shown_prompt)
  1298.     {
  1299. #endif /* QUIETBACKGROUND */
  1300. #ifdef NONDSP
  1301.       PromptForMove ();
  1302. #else
  1303.       ShowSidetoMove ();
  1304.       ShowPrompt ();
  1305. #endif
  1306. #ifdef QUIETBACKGROUND
  1307.     }
  1308.       have_shown_prompt = false;
  1309. #endif /* QUIETBACKGROUND */
  1310. #ifdef NONDSP
  1311.       s[0] = sx[0] = '\0';
  1312. #ifndef AMIGA
  1313.       while (!sx[0])
  1314.     i = (int) gets (sx);
  1315. #else
  1316.        thinking2 = 0;
  1317.        i = 1;
  1318.        thinkahead = 0;
  1319.        GetOperatorEntry(sx);
  1320. #endif
  1321. #else
  1322.      /* fflush (stdout);
  1323.       i = (int) getstr (sx);*/
  1324. #endif
  1325.       sscanf (sx, "%s", s);
  1326.       if (i == EOF)
  1327.     ExitChess ();
  1328.       if (s[0] == '\0')
  1329.     continue;
  1330.       if (strcmp (s, CP[131]) == 0)    /*bd*/
  1331.     {
  1332. #if defined CHESSTOOL || defined XBOARD
  1333.       chesstool = 0;
  1334. #endif /* CHESSTOOL */
  1335.       ClrScreen ();
  1336.       UpdateDisplay (0, 0, 1, 0);
  1337. #if defined CHESSTOOL || defined XBOARD
  1338.       chesstool = 1;
  1339. #endif /* CHESSTOOL */
  1340.     }
  1341.       else if (strcmp (s, CP[129]) == 0) /* noop */ ;    /*alg*/
  1342.       else if ((strcmp (s, CP[180]) == 0) || (strcmp (s, CP[216]) == 0))    /* quit exit*/
  1343.     flag.quit = true;
  1344.       else if (strcmp (s, CP[178]) == 0)    /*post*/
  1345.     {
  1346.      /* flag.post = !flag.post;*/
  1347.     }
  1348.       else if ((strcmp (s, CP[191]) == 0) || (strcmp (s, CP[154]) == 0))    /*set edit*/
  1349.     EditBoard ();
  1350. #ifdef NONDSP
  1351.       else if (strcmp (s, CP[190]) == 0)    /*setup*/
  1352.     SetupBoard ();
  1353. #endif
  1354.       else if (strcmp (s, CP[156]) == 0)    /*first*/
  1355.     {
  1356. #if defined CHESSTOOL
  1357.       computer = white;
  1358.       opponent = black;
  1359.       flag.force = false;
  1360.       Sdepth = 0;
  1361. #endif /* CHESSTOOL */
  1362.       ok = true;
  1363.     }
  1364.       else if (strcmp (s, CP[162]) == 0)    /*go*/
  1365.     {
  1366.       ok = true;
  1367.       flag.force = false;
  1368.       if (computer == white)
  1369.         {
  1370.           computer = black;
  1371.           opponent = white;
  1372.         }
  1373.       else
  1374.         {
  1375.           computer = white;
  1376.           opponent = black;
  1377.         }
  1378.     }
  1379.       else if (strcmp (s, CP[166]) == 0)    /*help*/
  1380.     help ();
  1381.       else if (strcmp (s, CP[221]) == 0)    /*material*/
  1382.     flag.material = !flag.material;
  1383.       else if (strcmp (s, CP[157]) == 0)    /*force*/
  1384.     {flag.force = !flag.force; flag.bothsides = false;}
  1385.       else if (strcmp (s, CP[134]) == 0)    /*book*/
  1386.     Book = Book ? 0 : BOOKFAIL;
  1387.       else if (strcmp (s, CP[172]) == 0)    /*new*/
  1388.     {
  1389.       NewGame ();
  1390.       UpdateDisplay (0, 0, 1, 0);
  1391.     }
  1392.       else if (strcmp (s, CP[171]) == 0)    /*list*/
  1393.     ListGame (0xff);
  1394.       else if (strcmp (s, CP[169]) == 0 || strcmp (s, CP[217]) == 0)    /*level clock*/
  1395.        {
  1396.         GetTimeString(tstr);
  1397.     SelectLevel (tstr);
  1398.        }
  1399.       else if (strcmp (s, CP[165]) == 0)    /*hash*/
  1400.     flag.hash = !flag.hash;
  1401.       else if (strcmp (s, CP[132]) == 0)    /*beep*/
  1402.     flag.beep = !flag.beep;
  1403.       else if (strcmp (s, CP[197]) == 0)    /*time*/
  1404.     {
  1405.       SetMachineTime (sx);
  1406.     }
  1407.       else if (strcmp (s, CP[33]) == 0)    /*Awindow*/
  1408.     ChangeAlphaWindow ();
  1409.       else if (strcmp (s, CP[39]) == 0)    /*Bwindow*/
  1410.     ChangeBetaWindow ();
  1411.       else if (strcmp (s, CP[183]) == 0)    /*rcptr*/
  1412.     flag.rcptr = !flag.rcptr;
  1413.       else if (strcmp (s, CP[168]) == 0)    /*hint*/
  1414.        {
  1415.     GiveHint ();
  1416.        }
  1417.       else if (strcmp (s, CP[135]) == 0)    /*both*/
  1418.     {
  1419.       flag.bothsides = !flag.bothsides;
  1420.           if (flag.bothsides)
  1421.            {
  1422.             (void)SetTaskPri((struct Task *)myproc,0);
  1423.             thinkahead = 1;
  1424.            }
  1425.           flag.force = false;
  1426.       Sdepth = 0;
  1427.       ElapsedTime (1);
  1428.       SelectMove (opponent, 1);
  1429.       ok = true;
  1430.     }
  1431.       else if (strcmp (s, CP[185]) == 0)    /*reverse*/
  1432.     {
  1433. #ifndef AMIGA
  1434.       flag.reverse = !flag.reverse;
  1435.       ClrScreen ();
  1436.       UpdateDisplay (0, 0, 1, 0);
  1437. #endif
  1438.     }
  1439.       else if (strcmp (s, CP[195]) == 0)    /*switch*/
  1440.     {
  1441.       computer = computer ^ 1;
  1442.       opponent = opponent ^ 1;
  1443.       xwndw = (computer == white) ? WXWNDW : BXWNDW;
  1444.       flag.force = false;
  1445.       Sdepth = 0;
  1446.       if ((!GameCnt) && (Book) && (flag.regularstart))
  1447.        GetOpenings(computer);
  1448.           else
  1449.            Book = 0;
  1450.       ok = true;
  1451.     }
  1452.       else if (strcmp (s, CP[203]) == 0)    /*white*/
  1453.     {
  1454.       computer = black;
  1455.       opponent = white;
  1456.       xwndw = WXWNDW;
  1457.       flag.force = false;
  1458.       Sdepth = 0;
  1459.  
  1460.       /*
  1461.            * ok = true; don't automatically start with white command
  1462.            */
  1463.     }
  1464.       else if (strcmp (s, CP[133]) == 0)    /*black*/
  1465.     {
  1466.       computer = white;
  1467.       opponent = black;
  1468.       xwndw = BXWNDW;
  1469.       flag.force = false;
  1470.       Sdepth = 0;
  1471.  
  1472.       /*
  1473.            * ok = true; don't automatically start with black command
  1474.            */
  1475.     }
  1476.       else if (strcmp (s, CP[201]) == 0 && GameCnt > 0)    /*undo*/
  1477.     {
  1478. #ifndef AMIGA
  1479.       Undo ();
  1480. #endif
  1481.     }
  1482.       else if (strcmp (s, CP[184]) == 0 && GameCnt > 1)    /*remove*/
  1483.     {
  1484. #ifndef AMIGA
  1485.       Undo ();
  1486.       Undo ();
  1487. #endif
  1488.     }
  1489.       else if (strcmp (s, CP[160]) == 0)    /*get*/
  1490.     GetGame ();
  1491.       else if (strcmp (s, CP[207]) == 0)    /*xget*/
  1492.     GetXGame ();
  1493.       else if (strcmp (s, CP[189]) == 0)    /*save*/
  1494.     SaveGame ();
  1495.       else if (strcmp (s, CP[151]) == 0)    /*depth*/
  1496.     ChangeSearchDepth ();
  1497. #ifdef DEBUG
  1498.       else if (strcmp (s, CP[147]) == 0)    /*debuglevel*/
  1499.     ChangeDbLev ();
  1500. #endif /* DEBUG */
  1501.       else if (strcmp (s, CP[164]) == 0)    /*hashdepth*/
  1502.     ChangeHashDepth ();
  1503.       else if (strcmp (s, CP[182]) == 0)    /*random*/
  1504.     dither = DITHER;
  1505.       else if (strcmp (s, CP[152]) == 0)    /*easy*/
  1506.        {
  1507.     /*flag.easy = !flag.easy;*/
  1508.     flag.easy = flag.easy; /* mod this for menu toggle on amiga */
  1509.        }
  1510.       else if (strcmp (s, CP[143]) == 0)    /*contempt*/
  1511.     SetContempt ();
  1512.       else if (strcmp (s, CP[209]) == 0)    /*xwndw*/
  1513.     ChangeXwindow ();
  1514.       else if (strcmp (s, CP[186]) == 0)    /*rv*/
  1515.     {
  1516.       flag.rv = !flag.rv;
  1517.       UpdateDisplay (0, 0, 1, 0);
  1518.     }
  1519.       else if (strcmp (s, CP[145]) == 0)    /*coords*/
  1520.     {
  1521.       flag.coords = !flag.coords;
  1522.       UpdateDisplay (0, 0, 1, 0);
  1523.     }
  1524.       else if (strcmp (s, CP[193]) == 0)    /*stras*/
  1525.     {
  1526.       flag.stars = !flag.stars;
  1527.       UpdateDisplay (0, 0, 1, 0);
  1528.     }
  1529.       else if (strcmp (s, CP[196]) == 0)    /*test*/
  1530.     {
  1531. /*      ShowMessage (CP[108]);/*test movelist*/
  1532.           ShowMessage ("Testing..");
  1533.           func_num = 0;
  1534.       TestSpeed (MoveList, 20000);
  1535. /*      ShowMessage (CP[107]);/*test capturelist*/
  1536.           func_num++;
  1537.       TestSpeed (CaptureList, 30000);
  1538. /*      ShowMessage (CP[85]);/*test score position*/
  1539.           func_num++;
  1540.       TestPSpeed (ScorePosition, 15000);
  1541.     }
  1542.       else
  1543.       if (strcmp (s, CP[179]) == 0)    /*p*/
  1544.     ShowPostnValues ();
  1545.       else if (strcmp (s, CP[148]) == 0)    /*debug*/
  1546.     DoDebug ();
  1547.     else if (strcmp (s, "Mwpawn") == 0)        /*debug*/
  1548.         DoTable (Mwpawn);
  1549.     else if (strcmp (s, "Mbpawn") == 0)        /*debug*/
  1550.         DoTable (Mbpawn);
  1551.     else if (strcmp (s, "Mwknight") == 0)        /*debug*/
  1552.         DoTable (Mknight[white]);
  1553.     else if (strcmp (s, "Mbknight") == 0)        /*debug*/
  1554.         DoTable (Mknight[black]);
  1555.     else if (strcmp (s, "Mwbishop") == 0)        /*debug*/
  1556.         DoTable (Mbishop[white]);
  1557.     else if (strcmp (s, "Mbbishop") == 0)        /*debug*/
  1558.         DoTable (Mbishop[black]);
  1559.       else
  1560.     { /* this is where we move the humans pieces */
  1561. #if defined CHESSTOOL
  1562.       normal = (ok = VerifyMove (s, 0, &mv));
  1563. #else
  1564.       ok = VerifyMove (s, 0, &mv);
  1565. #endif
  1566. #ifdef OLDVERSION1_01
  1567.       if ((ok && mv != hint))
  1568.         {
  1569.           Sdepth = 0;
  1570.           ft = 0;
  1571.         }
  1572.       else
  1573.         Sdepth = 0;
  1574. #else
  1575. #ifndef OLD_LOOKAHEAD
  1576.           if ((ok)&&((mv != hint)||(flag.easy)||(Sdepth2<3)))
  1577.            {
  1578.             Sdepth = 0;
  1579.             need_to_zero = 1;
  1580.            }
  1581. #endif
  1582.           if (ok)
  1583.            {
  1584.         if ((!flag.easy)&&(mv == hint)&&(Sdepth2>2))
  1585.              {
  1586.               ThinkAheadDepth = Sdepth2;
  1587.               if (ThinkInARow > 4) /* if it got to 4, we would have skipped one */
  1588.                ThinkInARow = 0;
  1589.               ThinkAheadWorked = 1;
  1590.              }
  1591.             else
  1592.              { 
  1593.              ThinkInARow = 0;
  1594.               ThinkAheadDepth = 0;
  1595.               ThinkAheadWorked = 0;
  1596.              }
  1597.            } // ok
  1598. #endif
  1599.           if ((!ok))
  1600.            {
  1601.             IllegalMove = 1;
  1602.            }
  1603.           if ((ok)&&(MouseDropped))
  1604.            {
  1605.                 DoLegalMove(s);
  1606.                 MouseDropped = 0;
  1607.            }
  1608.           if (need_to_zero)
  1609.            {
  1610.             need_to_zero = 0;
  1611.             ZeroTTable();
  1612.            }
  1613.           if (!ok)
  1614.            MouseDropped = 0;
  1615.     }
  1616.     }
  1617.  
  1618.   ElapsedTime (1);
  1619.   if (flag.force)
  1620.     {
  1621.       computer = opponent;
  1622.       opponent = computer ^ 1;
  1623.     }
  1624. #if defined CHESSTOOL || defined XBOARD
  1625. #if defined CHESSTOOL
  1626.   if (normal)
  1627.     if (computer == white)
  1628.       printz ("%d. %s", ++mycnt2, s);
  1629.     else
  1630.       printz ("%d. ... %s", ++mycnt2, s);
  1631. #else
  1632.   printz ("%d. %s\n", ++mycnt2, s);
  1633. #endif
  1634. #ifdef notdef
  1635.   if (flag.post)
  1636.     {
  1637.       REG int i;
  1638.  
  1639.       printz (" %6d ", MSCORE);
  1640.       for (i = 1; MV[i] > 0; i++)
  1641.     {
  1642.       algbr ((INTSIZE) (MV[i] >> 8), (INTSIZE) (MV[i] & 0xFF), false);
  1643.       printz ("%5s ", mvstr[0]);
  1644.     }
  1645.     }
  1646.   printz ("\n");
  1647. #endif
  1648. #endif /* CHESSTOOL */
  1649.   signal (SIGINT, TerminateSearch);
  1650. #ifndef MSDOS
  1651.   signal (SIGQUIT, TerminateSearch);
  1652. #endif /* MSDOS */
  1653. }
  1654.  
  1655.  
  1656. void
  1657. ElapsedTime (INTSIZE int iop)
  1658.  
  1659.  
  1660. /*
  1661.  * Determine the time that has passed since the search was started. If the
  1662.  * elapsed time exceeds the target (ResponseTime+ExtraTime) then set timeout
  1663.  * to true which will terminate the search. iop = 0 calculate et bump ETnodes
  1664.  * iop = 1 calculate et set timeout if time exceeded, calculate et
  1665.  */
  1666.  
  1667. {
  1668. #ifndef MSDOS
  1669.   extern int errno;
  1670. #ifdef AMIGA
  1671.    struct IntuiMessage *localmessage;
  1672.    long __aligned class,code;
  1673. #endif
  1674. #ifndef AMIGA
  1675. #ifdef FIONREAD
  1676.   if (i = ioctl ((int) 0, FIONREAD, &nchar))
  1677.     {
  1678.       perror ("FIONREAD");
  1679.       fprintf (stderr,
  1680.         "You probably have a non-ANSI <ioctl.h>; see README. %d %d %x\n",
  1681.     i, errno, FIONREAD);
  1682.       exit (1);
  1683.     }
  1684.  
  1685.   if (nchar)
  1686.     {
  1687.       if (!flag.timeout)
  1688.     flag.back = true;
  1689.       flag.bothsides = false;
  1690.     }
  1691. #endif /*FIONREAD*/
  1692. #endif
  1693. #ifdef AMIGA /* check if I need to interrupt thinking */
  1694.   if (thinkahead)
  1695.   {
  1696.   while ( (localmessage = (struct IntuiMessage *)
  1697.     GetMsg(wG->UserPort) )) /* got a message at window port */
  1698.    {
  1699.         if (localmessage->Class == RAWKEY)
  1700.          {
  1701.           if (localmessage->Code < 56)
  1702.            code = cookedchar[localmessage->Code];
  1703.           else
  1704.            code = 0;
  1705.          }
  1706.         else
  1707.          {
  1708.           code = 'A';
  1709.          }
  1710.         if (isalpha(code))
  1711.          {
  1712.           (void)SetTaskPri((struct Task *)myproc,procpri);
  1713.           if (!TCflag)
  1714.            backsrchaborted = 1;
  1715.           if (!flag.timeout)
  1716.            {
  1717.             flag.back = true;
  1718.            }
  1719.           flag.bothsides = false;
  1720.       globalmessage_valid = 0xffff;
  1721.           globalmessage = *localmessage;
  1722.          }
  1723.     ReplyMsg((struct Message *)localmessage);
  1724.    }
  1725.   }
  1726.   else if (thinking2) /* check for move now menu item */
  1727.   {
  1728.   while ( (localmessage = (struct IntuiMessage *)
  1729.     GetMsg(wG->UserPort) )) /* got a message at window port */
  1730.    {
  1731.     class = localmessage->Class;
  1732.         code = localmessage->Code;
  1733.     ReplyMsg((struct Message *)localmessage);
  1734.         if ((class == MENUPICK))
  1735.           {
  1736.         if (ItemAddress(&Menu1,code) == &MenuItem6)
  1737.             {
  1738.              if (!flag.timeout)
  1739.               {
  1740.                flag.back = true;
  1741.               flag.musttimeout = true;
  1742.               }
  1743.              flag.bothsides = false;
  1744.             }
  1745.           }
  1746.    }
  1747.   }
  1748. #endif
  1749. #else
  1750.   if (kbhit ())
  1751.     {
  1752.       if (!flag.timeout)
  1753.     flag.back = true;
  1754.       flag.bothsides = false;
  1755.     }
  1756. #endif /* MSDOS */
  1757.   et = (time ((long *) 0) - time0) * 100;
  1758.   ETnodes = NodeCnt + ZNODES;
  1759.   if (et < 0)
  1760.     et = 0;
  1761.   if (iop == 1)
  1762.     {
  1763.       if (et > ResponseTime + ExtraTime && Sdepth > MINDEPTH)
  1764.     flag.timeout = true;
  1765.       ETnodes = NodeCnt + ZNODES;
  1766.       time0 = time ((long *) 0);
  1767.     }
  1768. #ifdef AMIGA
  1769.     UpdateClocks ();
  1770. //sprintf(tstr,"%d",et);
  1771. //ShowMessage(tstr);
  1772. #endif
  1773. }
  1774.  
  1775.  
  1776. void
  1777. SetTimeControl (void)
  1778. {
  1779.  int tmp;
  1780.   if (TCflag)
  1781.     {
  1782.       TimeControl.moves[white] = TimeControl.moves[black] = TCmoves;
  1783.       TimeControl.clock[white] = 6000L * TCminutes + TCseconds * 100;
  1784.       TimeControl.clock[black] = 6000L * TCminutes + TCseconds * 100;
  1785.       SecsPerMove = tmp = (TCminutes*60+TCseconds)/TCmoves;
  1786.       if (tmp < 10)
  1787.        {
  1788.         GlobalTgtDepth = 2;
  1789.        }
  1790.       else if (tmp < 180)
  1791.        {
  1792.         GlobalTgtDepth = 3;
  1793.        }
  1794.       else
  1795.        GlobalTgtDepth = 4;
  1796.     }
  1797.   else
  1798.     {
  1799.       TimeControl.moves[white] = TimeControl.moves[black] = 0;
  1800.       TimeControl.clock[white] = TimeControl.clock[black] = 0;
  1801.     }
  1802.   flag.onemove = (TCmoves == 1);
  1803.   et = 0;
  1804.   ElapsedTime (1);
  1805. }
  1806.